﻿/**
 * @file CustomProtocolCommand.h
 * @brief SSD仿真系统自定义协议命令相关类型定义。
 */
#ifndef __CustomProtocolCommand_h__
#define __CustomProtocolCommand_h__

#include "BasicTypes.h"
#include "Buffer/Types.h"

class CustomProtocolHal;

/**
 * @struct DownloadAndExecutePayload
 * @brief 下载并执行命令的载荷。
 */
struct DownloadAndExecutePayload
{
    U8 CodeName[20]; /**< 固件代码名称 */
};

/**
 * @union BenchmarkPayload
 * @brief 基准测试命令的载荷。
 */
union BenchmarkPayload
{
    struct
    {
        long long Duration; /**< 测试持续时间 */
        U32 NopCount;       /**< NOP操作次数 */
    } Response;
};

/**
 * @struct SimpleFtlPayload
 * @brief 简单FTL命令的载荷。
 */
struct SimpleFtlPayload
{
    U32 Lba;         /**< 逻辑块地址 */
    U32 SectorCount; /**< 扇区数 */
};

/**
 * @struct DeviceInfoPayload
 * @brief 设备信息命令的载荷。
 */
struct DeviceInfoPayload
{
    U32 TotalSector;       /**< 设备总扇区数 */
    SectorInfo SectorInfo; /**< 扇区信息 */
    U8 SectorsPerPage;     /**< 每页扇区数 */
};

/**
 * @struct SectorInfoPayload
 * @brief 扇区信息命令的载荷。
 */
struct SectorInfoPayload
{
    SectorInfo SectorInfo; /**< 扇区信息 */
};

/**
 * @union CustomProtocolCommandDescriptor
 * @brief 自定义协议命令载荷联合体。
 */
union CustomProtocolCommandDescriptor
{
    DownloadAndExecutePayload DownloadAndExecute; /**< 下载并执行命令载荷 */
    BenchmarkPayload BenchmarkPayload;            /**< 基准测试命令载荷 */
    SimpleFtlPayload SimpleFtlPayload;            /**< 简单FTL命令载荷 */
    DeviceInfoPayload DeviceInfoPayload;          /**< 设备信息命令载荷 */
    SectorInfoPayload SectorInfoPayload;          /**< 扇区信息命令载荷 */
};

/**
 * @typedef CommandId
 * @brief 命令ID类型。
 */
typedef U32 CommandId;

/**
 * @struct CustomProtocolCommand
 * @brief 自定义协议命令结构体。
 */
struct CustomProtocolCommand
{
    /**
     * @enum Code
     * @brief 命令类型枚举。
     */
    enum class Code
    {
        DownloadAndExecute, /**< 下载并执行固件代码 */
        BenchmarkStart,     /**< 启动基准测试 */
        BenchmarkEnd,       /**< 结束基准测试 */
        Write,              /**< 写操作 */
        LoopbackWrite,      /**< 回环写操作 */
        Read,               /**< 读操作 */
        LoopbackRead,       /**< 回环读操作 */
        GetDeviceInfo,      /**< 获取设备信息 */
        SetSectorSize,      /**< 设置扇区大小 */
        Nop                 /**< 空操作 */
    };

    /**
     * @enum Status
     * @brief 命令状态枚举。
     */
    enum class Status
    {
        Success,    /**< 成功 */
        ReadError,  /**< 读错误 */
        WriteError, /**< 写错误 */
        Failed,     /**< 失败 */
    };

public:
    Code Command;                               /**< 命令类型 */
    Status CommandStatus;                       /**< 命令状态 */
    CustomProtocolCommandDescriptor Descriptor; /**< 命令载荷 */

private:
    CommandId CommandId;            /**< 命令ID */
    friend class CustomProtocolHal; /**< 允许CustomProtocolHal访问私有成员 */
};

#endif